package com.atguigu.spzx.cloud.feign.api.client;

import com.atguigu.spzx.cloud.model.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

//远程访问user服务的客户端:
//  需要指定要访问的服务的ip+端口、还需要指定访问的接口资源路径、参数列表、请求方式、返回值类型
//FeignClient表示当前接口为一个feign客户端
@FeignClient(value = "spzx-cloud-user" ,fallback = UserClientFallback.class) //value值表示要访问服务在注册中心的名称(它会自动拉取ip+端口)
//spzx-cloud-user可以获取到要访问服务的 127.0.0.1+10101
public interface UserClient {//UserClient对应的是User整个服务
    //GetMapping 表示请求方式+ 请求的资源路径
    @GetMapping(value = "/api/user/findUserByUserId/{userId}")
    public User findUserByUserId(@PathVariable(value = "userId") Long userId);

    /*
        feign复用了springmvc的一些注解 但是解析方式不同
            feign使用接口注解+方法 构建请求报文
            参数列表不使用注解 表示以请求体方式传参
     */
    //1、请求参数：通过变量入参   url?k=v&k2=v2
    @GetMapping("/user/param/test1")
    public String test1(@RequestParam("userName") String userName ,
                        @RequestParam("address") String address);
    //2、请求参数： pojo入参
    //feign传参时 不使用注解 默认当做请求体传参，请求体有数据 默认使用post方式提交请求
    //feign提供了SpringQueryMap注解 可以将对象转为请求参数列表提交
    @GetMapping("/user/param/test2")
    public String test2(@SpringQueryMap User user);
    //3、请求参数：通过集合接收  Map     List
    @GetMapping("/user/param/test3")
    // @RequestParam 表示获取请求参数存到Map中
    public String test3(@RequestParam Map map);
    //url?ids=1,2,3,4
    @GetMapping("/user/param/test4")
    public String test4(@RequestParam List<Integer> ids);
    //4、请求体参数：
    @PostMapping("/user/param/test5")
    public String test5(@RequestBody User user);





}
